package com.atguigu.gmall.product.controller;

import com.atguigu.gmall.common.result.Result;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * @author atguigu-mqx
 */
@RestController
@RequestMapping("admin/product")
@RefreshScope
public class FileUploadController {

    //  获取到分布式文件存储系统的地址：
    @Value("${minio.endpointUrl}")
    private String endpointUrl;

    @Value("${minio.accessKey}")
    public String accessKey;

    @Value("${minio.secreKey}")
    public String secreKey;

    @Value("${minio.bucketName}")
    public String bucketName;

    //  /admin/product/fileUpload
    //  文件上传： springmvc 学过一个技术：MultipartFile 这个对象名称file 不能改！ 因为在页面固定值 “file”
    @PostMapping("fileUpload")
    public Result fileUpload(MultipartFile file) throws Exception{
        //  代码编写：
        // 使用MinIO服务的URL，端口，Access key和Secret key创建一个MinioClient对象
        //  MinioClient minioClient = new MinioClient("https://play.min.io", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
        MinioClient minioClient =
                MinioClient.builder()
                        .endpoint(endpointUrl)
                        .credentials(accessKey, secreKey)
                        .build();
        // 检查存储桶是否已经存在
        boolean found =
                minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!found) {
            // Make a new bucket called 'asiatrip'.
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        } else {
            System.out.println("Bucket 'asiatrip' already exists.");
        }

        // 使用putObject上传一个文件到存储桶中。
        //  文件上传：至少你的有一个上传之后的我文本名称：并且这个文件名称还不能重复！
        String fileName = System.currentTimeMillis() + UUID.randomUUID().toString();
        //  minioClient.putObject("asiatrip","asiaphotos.zip", "/home/user/Photos/asiaphotos.zip");
        // Upload known sized input stream.
        minioClient.putObject(
                PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                        file.getInputStream(), file.getSize(), -1)
                        .contentType(file.getContentType())
                        .build());
        //  endpointUrl + bucketName + fileName;
        //  http://192.168.200.129:9000+"/"+gmall+fileName
        String url = endpointUrl + "/" + bucketName + "/"+fileName;
        //  返回数据 是什么?   文件上传的路径！
        return Result.ok(url);
    }
}
